package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name     string  `json:"name"`
	Age      int     `json:"age"`
	Birthday string  `json:"birthday"`
	Sal      float64 `json:"sal"`
	Skill    string  `json:"skill"`
}

/*
* 测试 struct 转json
 */
func testStruct() {
	monster := Monster{
		Name:     "牛魔王",
		Age:      500,
		Birthday: "2011-11-11",
		Sal:      8000.0,
		Skill:    "'牛魔拳",
	}
	//系列化
	data, err := json.Marshal(&monster)
	if err != nil {
		fmt.Printf("系列化失败 err=%v \n", err)
	}
	//输出系列化结果
	fmt.Printf("monster系列化后=%v \n", string(data))
	// fmt.Println(monster)
}

/*
*   测试将map转json
*
 */
func testMap() {
	//定义一个map
	var mapJson map[string]interface{}
	//使用map，需要make
	mapJson = make(map[string]interface{})
	mapJson["name"] = "红孩儿"
	mapJson["age"] = 30
	mapJson["addr"] = "洪崖洞"

	//系列化
	data, err := json.Marshal(mapJson)
	if err != nil {
		fmt.Printf("系列化失败 err=%v \n", err)
	}
	//输出系列化结果
	fmt.Printf("map 系列化后=%v \n", string(data))
}

/*
* 测试将slice 转json
 */
func testSlice() {

	var slice []map[string]interface{}

	//使用map前，需要先make
	m1 := make(map[string]interface{})
	m1["name"] = "jack"
	m1["age"] = 17
	m1["addr"] = "北京"

	slice = append(slice, m1)

	//使用map前，需要先make
	m2 := make(map[string]interface{})
	m2["name"] = "sam"
	m2["age"] = 19
	m2["addr"] = [2]string{"北京", "上海"}

	slice = append(slice, m2)

	//系列化
	data, err := json.Marshal(slice)
	if err != nil {
		fmt.Printf("系列化失败 err=%v \n", err)
	}
	//输出系列化结果
	fmt.Printf("slice系列化后=%v \n", string(data))
}

func main() {
	testStruct()
	testMap()
	testSlice()
}

/*
monster系列化后={"name":"牛魔王","age":500,"birthday":"2011-11-11","sal":8000,"skill":"'牛魔拳"}
monster系列化后={"addr":"洪崖洞","age":30,"name":"红孩儿"}
slice系列化后=[{"addr":"北京","age":17,"name":"jack"},{"addr":["北京","上海"],"age":19,"name":"sam"}]

*/
